In [1]:
%pylab inline
import ipywidgets as ipw
%pylab is deprecated, use %matplotlib inline and import the required libraries. Populating the interactive namespace from numpy and matplotlib
In [ ]:
Diffrakció krumpli alakú résen ¶
Az amplitudó:¶
\begin{align} U(\mathbf{R} ) &= \frac{k}{2\pi L}\,\sum_{\mathbf{r}\in S} e^{i k\left|\mathbf{R}-\mathbf{r}\right|}, \nonumber \\ I (\mathbf{R} ) &= {\left|U(\mathbf{R} )\right|}^2 , \nonumber \end{align}¶
ahol $\mathbf{R}$ az ernyő, $\mathbf{r}$ az $S$ rés egy pontja, $L$ a rés és az ernyő közti távolság, $k=2\pi/\lambda$ a hullámszám.¶
Irodalom:¶
Eugene Hecht: Optics¶
https://math.stackexchange.com/questions/1503415/diffraction-and-fresnel-integrals¶
K.M. Abedin, M.R. Islam, A.F.M.Y. Haider: Computer simulation of Fresnel diffraction from rectangular apertures and obstacles using the Fresnel integrals approach¶
AZoOptics is a totally free-to-access, online information resource dedicated to the optics and photonics community.¶
Link: AZoOptics¶
Fresnel vs Fraunhoffer Diffraction¶
Köszönöm Oroszlány Lászlónak, hogy segített a python code megírásában.¶
In [2]:
a, lam, z =(2*10**(-3), 632.0*10**(-9), 400*10**(-3))
ka = 2*pi/lam* a
za =z/a
ka,za,a**2/lam/z
Out[2]:
(19883.497807530337, 200.0, 15.82278481012658)
In [ ]:
In [3]:
def diffraction_1D(xR,yR, L, k, xr, yr, Nr):
### 1D plot on the screen line defined by the array of xR and yR
## xR,yR ---> ernyo pontjai
xxr,yyr=meshgrid(xr,yr) ## ---> res pontjai
wr=xr.max()
dA = (2*wr/Nr)**2 *k/(2*pi)/L #*k/(2*pi)/L
Intensity = abs(
exp(1j*k*sqrt(
(xxr[:,:,None]-xR[None,None,:])**2
+(yyr[:,:,None]-yR[None,None,:])**2
+L**2)
).sum(axis=0).sum(axis=0)*dA
)**2
return Intensity
def diffraction_2D(xR,yR, L, k, xr, yr, Nr):
### 2D plot on the screen (xR,yR)
## xR,yR ---> ernyo pontjai
xxR,yyR=meshgrid(xR,yR) ## ---> ernyo pontjai
xxr,yyr=meshgrid(xr,yr) ## ---> res pontjai
wr=xr.max()
dA = (wr/Nr)**2
Intensity = abs(
exp(1j*k*sqrt(
(xxr[:,:,None,None]-xxR[None,None,:,:])**2
+(yyr[:,:,None,None]-yyR[None,None,:,:])**2
+L**2)
).sum(axis=0).sum(axis=0)*dA
)**2 #*ka/(2*pi)/L
return Intensity
In [4]:
abs(-4)**2
Out[4]:
16
In [5]:
## A res pontjai
Nr= 40
a=1 ## res merete
b=1/2
xr = linspace(-a/2,a/2,Nr)
yr = linspace(-b/2,b/2,Nr)
diffraction_1D(array([1]),array([2]),200,12000,xr,yr,Nr)
Out[5]:
array([4.62019469e-05])
In [6]:
diffraction_1D(array([1,2]),array([-2,1]),200,12000,xr,yr,Nr)
Out[6]:
array([4.62019469e-05, 4.68862788e-05])
In [7]:
## a ---> resmeret
k = 1000 # ---> 2*pi/lam *resmeret = k*a
L = 20.0 # ---> L/a = a res es az ernyo kozti tavolsag
Np = 50 # az ernyon a mintavetelezesi pontok szama
########## A res pontjai
Nr= 40 # a resen a mintavetelezesi pontok szama
a=1 ## res merete
b=1/2
xr = linspace(-a/2,a/2,Nr)
yr = linspace(-b/2,b/2,Nr)
########## ernyo pontajai
fact = 1.0
screen_size = fact*a # az ernyo (x,y) merete
xp=linspace(-screen_size,screen_size,Np)
yp=xp
print('k*a = ',k)
print('z = L/a = ',L)
print('A resen a pontok szama x, y iranyokban= ',len(xr))
print('Az ernyon a pontok szama x, y iranyokban= ',len(xp))
print('Fresnel-szam = ',k/(2*pi)/L)
print('z_0/a = ',k/(pi))
Am2 = diffraction_2D(xp,yp, L, k, xr, yr, Nr)
minAm2, maxAm2=(min(flatten(Am2)),max(flatten(Am2)))
print('min, max |Am|**2 = ', minAm2,maxAm2)
fig, ax = plt.subplots(1, 1,figsize=(6,6))
#res=contourf(xp,yp,Am2,cmap='gray')
res=contourf(xp,yp,Am2,levels=linspace(minAm2,maxAm2,20))
colorbar(res, fraction=0.046, pad=0.04);
ax.set_title('Téglalap')
ax.set_aspect('equal')
%time
k*a = 1000 z = L/a = 20.0 A resen a pontok szama x, y iranyokban= 40 Az ernyon a pontok szama x, y iranyokban= 50 Fresnel-szam = 7.957747154594768 z_0/a = 318.3098861837907 min, max |Am|**2 = 6.266154599243888e-08 0.008118250503179382 CPU times: user 1 µs, sys: 1e+03 ns, total: 2 µs Wall time: 2.38 µs
In [8]:
fact =1
print('k*a = ',k)
print('z = L/a = ',L)
print('A resen a pontok szama x, y iranyokban= ',Nr)
print('Az ernyon a pontok szama x, y iranyokban= ',Np)
print('Fresnel-szam = ',k/(2*pi)/L)
print('z_0/a = ',k/(pi))
fig, ax = plt.subplots(1, 2,figsize=(12,6))
xe=linspace(-fact*a,fact*a,300)
Am2=diffraction_1D(xe,array([0]), L, k, xr, yr,Nr)
ax[0].plot(xe,Am2)
ax[0].set_xlabel(r'$x/a$',fontsize=16);
ax[0].set_title('Téglalap')
ax[0].grid()
ye=linspace(-fact*a,fact*a,300)
Am2=diffraction_1D(array([0]),ye, L, k, xr, yr,Nr)
ax[1].plot(ye,Am2.T)
ax[1].set_xlabel(r'$y/a$',fontsize=16);
ax[1].set_title('Téglalap')
ax[1].grid()
k*a = 1000 z = L/a = 20.0 A resen a pontok szama x, y iranyokban= 40 Az ernyon a pontok szama x, y iranyokban= 50 Fresnel-szam = 7.957747154594768 z_0/a = 318.3098861837907
In [12]:
@ipw.interact(L=(0.0,3000.0,10),
k=(0,20000.0,100),
wr=(0.1,10.0,.1),
wR=(0.5,10.0,0.5),
nr=(1,100,1),
nR=(1,100,1))
def play(L=50.0,k=1500.0,wr=2.0,wR=4.0,nr=40,nR=100): ## k=19883.0
rran=linspace(-wr/2,wr/2,nr)
xr,yr=meshgrid(rran,rran)
Rran=linspace(-wR/2,wR/2,nR)
xR,yR=meshgrid(Rran,Rran)
dA = (wr/nr)**2
Intensity = abs(
exp(1j*k*sqrt(
(xr[:,:,None,None]-xR[None,None,:,:])**2
+(yr[:,:,None,None]-yR[None,None,:,:])**2
+L**2)
).sum(axis=0).sum(axis=0)*dA
)**2
print('Fresnel szam =',k/(2*pi)/L)
print('z_0/a = ',k/(pi))
res=pcolormesh(Rran,Rran,Intensity)
#plot(Rran,Intensity[int(nR/2),:])
colorbar(res, fraction=0.046, pad=0.04);
title('Négyzet')
#ax.set_aspect('equal')
axis('equal');
interactive(children=(FloatSlider(value=50.0, description='L', max=3000.0, step=10.0), FloatSlider(value=1500.…
In [10]:
## a ---> resmeret
k = 1500 # ---> 2*pi/lam *resmeret = k*a
L = 20.0 # ---> L/a = a res es az ernyo kozti tavolsag
Np = 50 # az ernyon a mintavetelezesi pontok szama
In [11]:
@ipw.interact(L=(0.0,3000.0,10),
k=(0,20000.0,100),
wr=(0.1,10.0,.1),
wR=(0.5,10.0,1.0),
nr=(1,100,1),
nR=(1,100,1))
def play(L=50.0,k=1500.0,wr=2.0,wR=4.0,nr=40,nR=100):
### 1D plot on the screen line defined by the array of xR and yR
xr=linspace(-wr/2,wr/2,nr)
yr=xr
xxr,yyr=meshgrid(xr,yr) ## ---> res pontjai
wr=xr.max()
dA = (2*wr/nr)**2 *k/(2*pi)/L #*k/(2*pi)/L
## xR,yR ---> ernyo pontjai
xR=linspace(-wR/2,wR/2,200)
yR=array([0])
Intensity = abs(
exp(1j*k*sqrt(
(xxr[:,:,None]-xR[None,None,:])**2
+(yyr[:,:,None]-yR[None,None,:])**2
+L**2)
).sum(axis=0).sum(axis=0)*dA
)**2
print('Fresnel szam =',k/(2*pi)/L)
print('z_0/a = ',k/(pi))
#pcolormesh(Rran,Rran,Intensity)
plot(array(xR),array(Intensity))
grid()
interactive(children=(FloatSlider(value=50.0, description='L', max=3000.0, step=10.0), FloatSlider(value=1500.…
In [ ]:
VEGE¶
In [ ]: